home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-SPAR.{_6 / PAGE.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  8KB  |  290 lines

  1. /* $Id: page.h,v 1.43 1998/05/11 08:40:11 davem Exp $
  2.  * page.h:  Various defines and such for MMU operations on the Sparc for
  3.  *          the Linux kernel.
  4.  *
  5.  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  6.  */
  7.  
  8. #ifndef _SPARC_PAGE_H
  9. #define _SPARC_PAGE_H
  10.  
  11. #include <linux/config.h>
  12. #ifdef CONFIG_SUN4
  13. #define PAGE_SHIFT   13
  14. #else
  15. #define PAGE_SHIFT   12
  16. #endif
  17. #define PAGE_SIZE    (1 << PAGE_SHIFT)
  18. #define PAGE_MASK    (~(PAGE_SIZE-1))
  19.  
  20. #ifdef __KERNEL__
  21.  
  22. #include <linux/config.h>
  23. #include <asm/head.h>       /* for KERNBASE */
  24. #include <asm/btfixup.h>
  25.  
  26. /* This is always 2048*sizeof(long), doesn't change with PAGE_SIZE */
  27. #define TASK_UNION_SIZE        8192
  28.  
  29. #ifndef __ASSEMBLY__
  30.  
  31. #define clear_page(page)    memset((void *)(page), 0, PAGE_SIZE)
  32. #define copy_page(to,from)    memcpy((void *)(to), (void *)(from), PAGE_SIZE)
  33.  
  34. extern unsigned long page_offset;
  35.  
  36. BTFIXUPDEF_SETHI_INIT(page_offset,0xf0000000)
  37.  
  38. #ifdef MODULE
  39. #define     PAGE_OFFSET  (page_offset)
  40. #else
  41. #define        PAGE_OFFSET  BTFIXUP_SETHI(page_offset)
  42. #endif
  43.  
  44. /* translate between physical and virtual addresses */
  45. BTFIXUPDEF_CALL_CONST(unsigned long, mmu_v2p, unsigned long)
  46. BTFIXUPDEF_CALL_CONST(unsigned long, mmu_p2v, unsigned long)
  47.  
  48. #define mmu_v2p(vaddr) BTFIXUP_CALL(mmu_v2p)(vaddr)
  49. #define mmu_p2v(paddr) BTFIXUP_CALL(mmu_p2v)(paddr)
  50.  
  51. #define __pa(x)    (mmu_v2p((unsigned long)(x)))
  52. #define __va(x)    ((void *)(mmu_p2v((unsigned long)(x))))
  53.  
  54. /* The following structure is used to hold the physical
  55.  * memory configuration of the machine.  This is filled in
  56.  * probe_memory() and is later used by mem_init() to set up
  57.  * mem_map[].  We statically allocate SPARC_PHYS_BANKS of
  58.  * these structs, this is arbitrary.  The entry after the
  59.  * last valid one has num_bytes==0.
  60.  */
  61.  
  62. struct sparc_phys_banks {
  63.   unsigned long base_addr;
  64.   unsigned long num_bytes;
  65. };
  66.  
  67. #define SPARC_PHYS_BANKS 32
  68.  
  69. extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS];
  70.  
  71. /* Cache alias structure.  Entry is valid if context != -1. */
  72. struct cache_palias {
  73.     unsigned long vaddr;
  74.     int context;
  75. };
  76.  
  77. extern struct cache_palias *sparc_aliases;
  78.  
  79. /* passing structs on the Sparc slow us down tremendously... */
  80.  
  81. /* #define STRICT_MM_TYPECHECKS */
  82.  
  83. #ifdef STRICT_MM_TYPECHECKS
  84. /*
  85.  * These are used to make use of C type-checking..
  86.  */
  87. typedef struct { unsigned long pte; } pte_t;
  88. typedef struct { unsigned long iopte; } iopte_t;
  89. typedef struct { unsigned long pmd; } pmd_t;
  90. typedef struct { unsigned long pgd; } pgd_t;
  91. typedef struct { unsigned long ctxd; } ctxd_t;
  92. typedef struct { unsigned long pgprot; } pgprot_t;
  93. typedef struct { unsigned long iopgprot; } iopgprot_t;
  94.  
  95. #define pte_val(x)    ((x).pte)
  96. #define iopte_val(x)    ((x).iopte)
  97. #define pmd_val(x)      ((x).pmd)
  98. #define pgd_val(x)    ((x).pgd)
  99. #define ctxd_val(x)    ((x).ctxd)
  100. #define pgprot_val(x)    ((x).pgprot)
  101. #define iopgprot_val(x)    ((x).iopgprot)
  102.  
  103. #define __pte(x)    ((pte_t) { (x) } )
  104. #define __iopte(x)    ((iopte_t) { (x) } )
  105. #define __pmd(x)        ((pmd_t) { (x) } )
  106. #define __pgd(x)    ((pgd_t) { (x) } )
  107. #define __ctxd(x)    ((ctxd_t) { (x) } )
  108. #define __pgprot(x)    ((pgprot_t) { (x) } )
  109. #define __iopgprot(x)    ((iopgprot_t) { (x) } )
  110.  
  111. #elif CONFIG_AP1000_DEBUG
  112.  
  113. typedef struct { unsigned long pte; } pte_t;
  114. typedef struct { unsigned long iopte; } iopte_t;
  115. typedef struct { unsigned long pmd; } pmd_t;
  116. typedef struct { unsigned long pgd; } pgd_t;
  117. typedef struct { unsigned long ctxd; } ctxd_t;
  118. typedef struct { unsigned long pgprot; } pgprot_t;
  119. typedef struct { unsigned long iopgprot; } iopgprot_t;
  120.  
  121. static inline unsigned long __get_val(unsigned long x)
  122. {
  123.     if ((x & 0xF0000000) == (8<<28))
  124.         return x & 0x0FFFFFFF;
  125.     return x;
  126. }
  127.  
  128. static inline unsigned long __set_val(unsigned long x)
  129. {
  130.     if ((x & 0xF0000000) == (0<<28))
  131.         return x | 0x80000000;
  132.     return x;
  133. }
  134.  
  135. #define __pte_val(x)    ((x).pte)
  136. #define __iopte_val(x)    ((x).iopte)
  137. #define __pmd_val(x)      ((x).pmd)
  138. #define __pgd_val(x)    ((x).pgd)
  139. #define __ctxd_val(x)    ((x).ctxd)
  140. #define __pgprot_val(x)    ((x).pgprot)
  141. #define __iopgprot_val(x)    ((x).iopgprot)
  142.  
  143. #define ___pte(x)    ((pte_t) { (x) } )
  144. #define ___iopte(x)    ((iopte_t) { (x) } )
  145. #define ___pmd(x)        ((pmd_t) { (x) } )
  146. #define ___pgd(x)    ((pgd_t) { (x) } )
  147. #define ___ctxd(x)    ((ctxd_t) { (x) } )
  148. #define ___pgprot(x)    ((pgprot_t) { (x) } )
  149. #define ___iopgprot(x)    ((iopgprot_t) { (x) } )
  150.  
  151.  
  152. #define pte_val(x) __get_val(__pte_val(x))
  153. #define iopte_val(x) __get_val(__iopte_val(x))
  154. #define pmd_val(x) __get_val(__pmd_val(x))
  155. #define pgd_val(x) __get_val(__pgd_val(x))
  156. #define ctxd_val(x) __get_val(__ctxd_val(x))
  157. #define pgprot_val(x) __get_val(__pgprot_val(x))
  158. #define iopgprot_val(x) __get_val(__iopgprot_val(x))
  159.  
  160. #define __pte(x) ___pte(__set_val(x))
  161. #define __iopte(x) ___iopte(__set_val(x))
  162. #define __pmd(x) ___pmd(__set_val(x))
  163. #define __pgd(x) ___pgd(__set_val(x))
  164. #define __ctxd(x) ___ctxd(__set_val(x))
  165. #define __pgprot(x) ___pgprot(x)
  166. #define __iopgprot(x) ___iopgprot(__set_val(x))
  167.  
  168. #elif CONFIG_AP1000
  169.  
  170. typedef unsigned long pte_t;
  171. typedef unsigned long iopte_t;
  172. typedef unsigned long pmd_t;
  173. typedef unsigned long pgd_t;
  174. typedef unsigned long ctxd_t;
  175. typedef unsigned long pgprot_t;
  176. typedef unsigned long iopgprot_t;
  177.  
  178. static inline unsigned long __get_val(unsigned long x)
  179. {
  180. #if 0
  181.     extern void ap_panic(char *fmt,...);
  182.     if (x && (x & 0xF0000000) == 0) {
  183.         ap_panic("get_val got 0x%x\n",x);
  184.     }
  185. #endif
  186.     if ((x & 0xF0000000) == (8<<28))
  187.         return x & 0x0FFFFFFF;
  188.     return x;
  189. }
  190.  
  191. static inline unsigned long __set_val(unsigned long x)
  192. {
  193. #if 0
  194.     extern void ap_panic(char *fmt,...);
  195.     if ((x & 0xF0000000) == (8<<28)) {
  196.         ap_panic("set_val got 0x%x\n",x);
  197.     }
  198. #endif
  199.     if ((x & 0xF0000000) == (0<<28))
  200.         return x | 0x80000000;
  201.     return x;
  202. }
  203.  
  204. #define __pte_val(x)    (x)
  205. #define __iopte_val(x)    (x)
  206. #define __pmd_val(x)      (x)
  207. #define __pgd_val(x)    (x)
  208. #define __ctxd_val(x)    (x)
  209. #define __pgprot_val(x)    (x)
  210. #define __iopgprot_val(x)    (x)
  211.  
  212. #define ___pte(x)    ((pte_t) { (x) } )
  213. #define ___iopte(x)    ((iopte_t) { (x) } )
  214. #define ___pmd(x)        ((pmd_t) { (x) } )
  215. #define ___pgd(x)    ((pgd_t) { (x) } )
  216. #define ___ctxd(x)    ((ctxd_t) { (x) } )
  217. #define ___pgprot(x)    ((pgprot_t) { (x) } )
  218. #define ___iopgprot(x)    ((iopgprot_t) { (x) } )
  219.  
  220.  
  221. #define pte_val(x) __get_val(__pte_val(x))
  222. #define iopte_val(x) __get_val(__iopte_val(x))
  223. #define pmd_val(x) __get_val(__pmd_val(x))
  224. #define pgd_val(x) __get_val(__pgd_val(x))
  225. #define ctxd_val(x) __get_val(__ctxd_val(x))
  226. #define pgprot_val(x) __get_val(__pgprot_val(x))
  227. #define iopgprot_val(x) __get_val(__iopgprot_val(x))
  228.  
  229. #define __pte(x) ___pte(__set_val(x))
  230. #define __iopte(x) ___iopte(__set_val(x))
  231. #define __pmd(x) ___pmd(__set_val(x))
  232. #define __pgd(x) ___pgd(__set_val(x))
  233. #define __ctxd(x) ___ctxd(__set_val(x))
  234. #define __pgprot(x) ___pgprot(x)
  235. #define __iopgprot(x) ___iopgprot(__set_val(x))
  236.  
  237. #else
  238. /*
  239.  * .. while these make it easier on the compiler
  240.  */
  241. typedef unsigned long pte_t;
  242. typedef unsigned long iopte_t;
  243. typedef unsigned long pmd_t;
  244. typedef unsigned long pgd_t;
  245. typedef unsigned long ctxd_t;
  246. typedef unsigned long pgprot_t;
  247. typedef unsigned long iopgprot_t;
  248.  
  249. #define pte_val(x)    (x)
  250. #define iopte_val(x)    (x)
  251. #define pmd_val(x)      (x)
  252. #define pgd_val(x)    (x)
  253. #define ctxd_val(x)    (x)
  254. #define pgprot_val(x)    (x)
  255. #define iopgprot_val(x)    (x)
  256.  
  257. #define __pte(x)    (x)
  258. #define __iopte(x)    (x)
  259. #define __pmd(x)        (x)
  260. #define __pgd(x)    (x)
  261. #define __ctxd(x)    (x)
  262. #define __pgprot(x)    (x)
  263. #define __iopgprot(x)    (x)
  264.  
  265. #endif
  266.  
  267. extern unsigned long sparc_unmapped_base;
  268.  
  269. BTFIXUPDEF_SETHI(sparc_unmapped_base)
  270.  
  271. #define TASK_UNMAPPED_BASE    BTFIXUP_SETHI(sparc_unmapped_base)
  272.  
  273. /* to align the pointer to the (next) page boundary */
  274. #define PAGE_ALIGN(addr)  (((addr)+PAGE_SIZE-1)&PAGE_MASK)
  275.  
  276. /* Now, to allow for very large physical memory configurations we
  277.  * place the page pool both above the kernel and below the kernel.
  278.  */
  279. #define MAP_NR(addr) ((((unsigned long) (addr)) - PAGE_OFFSET) >> PAGE_SHIFT)
  280.  
  281. #else /* !(__ASSEMBLY__) */
  282.  
  283. #define __pgprot(x)    (x)
  284.  
  285. #endif /* !(__ASSEMBLY__) */
  286.  
  287. #endif /* __KERNEL__ */
  288.  
  289. #endif /* _SPARC_PAGE_H */
  290.